package cn.seczone.iast.agent;

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

/**
 * @author XieShaoping
 */
public class MyClassVisitor extends ClassVisitor {

    public MyClassVisitor(ClassVisitor classVisitor) {
        super(Opcodes.ASM9, classVisitor);
    }

    /**
     * @param version    class版本，如jdk8对应52
     * @param access
     * @param name       类名 如：com/example/webdemo/controller/TestController
     * @param signature  签名
     * @param superName  继承的父类名
     * @param interfaces 实现的接口，可以说多个
     */
    @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
        super.visit(version, access, name, signature, superName, interfaces);
    }

    /**
     * @param access
     * @param name       方法名
     * @param descriptor 方法描述符，如：(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
     * @param signature  签名
     * @param exceptions 抛异常的类名
     * @return
     */
    @Override
    public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
        //解析方法
//        if ("test".equals(name)) {
//            MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions);
//            return new MyAdapter(methodVisitor, access, name, descriptor);
//        }
        if ("test1".equals(name)) {
            MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions);
            return new MyInputAndReturnAdapter(methodVisitor, access, name, descriptor);
        }
        //下面是默认的方法。
        return this.cv != null ? this.cv.visitMethod(access, name, descriptor, signature, exceptions) : null;
    }

}